package com.atguigu.gulimall.product.exception;

import com.atguigu.common.exception.BizCodeEnum;
import com.atguigu.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.HashMap;

/**
 * @ClassName GulimallExceptionControllerAdvice
 * @Description
 * @Author LiQianJin~
 * @Date 2023/6/13 13:43
 * @Version 1.0
 */
@Slf4j
// 统一处理controller下所有的异常信息 最终将获取的异常错误数据以json格式返回
@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")
public class GulimallExceptionControllerAdvice {


    /****
     * @Description: MethodArgumentNotValidException.class  捕获具体异常
     * @Author: LiQianJin
     * @Date: 2023/6/13 13:55
     * @param e:
     * @return: com.atguigu.common.utils.R
     **/
    @ExceptionHandler(value = MethodArgumentNotValidException.class) // 告诉springmvc  统一处理以下方法的所有异常
    public R exceptionValidationHandler(MethodArgumentNotValidException e) {
        log.error("获取错误异常数据:{},错误类型:{}", e.getMessage(), e.getClass());
        BindingResult bindingResult = e.getBindingResult();
        HashMap<String, String> errorMap = new HashMap<>();
        // 获取MethodArgumentNotValidException的错误异常数据
        bindingResult.getFieldErrors().forEach((item) -> {
            // 错误信息
            String defaultMessage = item.getDefaultMessage();
            // 错误的属性字段
            String field = item.getField();
            errorMap.put(field, defaultMessage);
        });
        return R.error(BizCodeEnum.VALIDATION_EXCEPTION.getCode(), BizCodeEnum.VALIDATION_EXCEPTION.getMsg()).put("data", errorMap);
    }

    /***
     * @Description: Exception.class 捕获所有异常
     * @Author: LiQianJin
     * @Date: 2023/6/13 13:57
     * @return: com.atguigu.common.utils.R
     **/
    @ExceptionHandler(value = Exception.class)
    public R exceptionHandler(Exception e) {
        log.error("捕获异常错误数据:{},异常错误类型:{}", e.getMessage(), e.getClass());
        return R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());
    }

}
